home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Snippets / ShowInitAndName / 2. Variety Of Examples / Loch Ness.c next >
Text File  |  1996-01-12  |  9KB  |  294 lines

  1. #ifdef THINK_C
  2.      #include "::ShowInitAndName.h"
  3. #else
  4.      #include "ShowInitAndName.h"
  5. #endif
  6.  
  7. /* IMPORTANT: Read "ShowInitAndName.h" first!! */
  8.  
  9.  
  10.  
  11. #ifdef powerc
  12. ProcInfoType __procinfo = kThinkCStackBased;
  13. #endif
  14.  
  15. void main ( void );
  16. void WaitFor ( long howLongToWaitInSixtiethsOfASecond );
  17. void AppendCStringToCStringWithLimit ( char *destinationCStringPtr, char *sourceCStringPtr, unsigned long limit );
  18.  
  19. #define kExampleErrorMessagesSTRResourceID          128
  20. #define kExampleErrorMessagesCouldntGetFilename       1
  21. #define kExampleErrorMessagesNumberOfRandomMessages   4
  22.  
  23.  
  24. void main ( void )
  25. {
  26.      /*****************************************************/
  27.      /*                                                   */
  28.      /* YOU DON’T HAVE TO DO ALL OF THIS TO SHOW AN INIT! */
  29.      /*                                                   */
  30.      /* There are a bunch of variations in this example.  */
  31.      /* See the SIMPLE example for ordinary usage.        */ 
  32.      /*                                                   */
  33.      /*****************************************************/
  34.      
  35.      /* This code: 1) Gets the current filename for an init,                     
  36.                    2) Displays many example inits             */
  37.                   
  38.      /* 96/01/11   v1.0.0   David Cook   First version  */ 
  39.      
  40.      
  41.           
  42.      short exampleErrorMessageStringIndex; /* This will be the index to the example error message we display from the 'STR#' resource */
  43.     
  44.      unsigned long secs; /* We use this instead of a Random() number - since Random requires initialization of a graf port */
  45.     
  46.      Str255 tempPascalString;
  47.      char tempCString [ 255 + 1 ];
  48.      
  49.      char extensionNameInCFormat [ 255 + 1 ]; /* This is the c-format filename of the init */
  50.      
  51.      FCBPBRec hGetVolRecord; /* This is used to find out the current filename of the init */     
  52.      
  53.      
  54.      
  55.      /* Before we display our examples, let’s find out what the filename of this init is. */
  56.                
  57.      hGetVolRecord.ioCompletion = nil;
  58.      hGetVolRecord.ioFCBIndx = 0;
  59.      hGetVolRecord.ioVRefNum = 0;
  60.      hGetVolRecord.ioRefNum = CurResFile ( );
  61.      tempPascalString [ 0 ] = 0;
  62.      hGetVolRecord.ioNamePtr = (StringPtr) tempPascalString;
  63.      
  64.      if ( PBGetFCBInfo ( &hGetVolRecord, false ) != noErr )
  65.      {
  66.           CopyCStringFromPascalStringWithLimit ( extensionNameInCFormat, "\pThe Loch Ness Extension", 255 );
  67.           
  68.           /* Let the user know we couldn’t come up with our real filename. */
  69.           exampleErrorMessageStringIndex = kExampleErrorMessagesCouldntGetFilename;
  70.      }
  71.      else
  72.      {
  73.           CopyCStringFromPascalStringWithLimit ( extensionNameInCFormat, tempPascalString, 255 );
  74.           /* We’ve got our real filename, so let’s display a funny message chosen at random */
  75.           
  76.           GetDateTime ( &secs );
  77.           exampleErrorMessageStringIndex = kExampleErrorMessagesCouldntGetFilename + 1 + ( secs % kExampleErrorMessagesNumberOfRandomMessages );
  78.           /* We’re using GetDateTime because the real Random() function only works when Quickdraw is active */
  79.      }     
  80.      
  81.      
  82.      
  83.      
  84. /**************/
  85. /*            */
  86. /* EXAMPLE #1 */
  87. /*            */
  88. /**************/
  89.  
  90.      /* Now we’re actually going to display some init icons and names */
  91.      
  92.      
  93.      /* The Loch Ness Extension */
  94.      /* This example shows the most common way to show an init. */
  95.      
  96.        
  97.      ShowInitAndName ( 135, extensionNameInCFormat, nil, noErr, false ); /* Show the icon and init name and hilite the name (like it is selected) */  
  98.      WaitFor ( 90 ); /* Pretend to do actual init work here */
  99.      ShowInitAndName ( 135, extensionNameInCFormat, nil, noErr, true ); /* Show the icon and init name again, but don’t hilite the name. and then move over for the next init */         
  100.  
  101.  
  102.  
  103.  
  104.  
  105.      
  106.      WaitFor ( 15 ); /* Fake pause between inits */
  107.      
  108.      
  109.      
  110.      
  111.      
  112. /**************/
  113. /*            */
  114. /* EXAMPLE #2 */
  115. /*            */
  116. /**************/  
  117.      
  118.      /* CICNs */
  119.      /* In this example we’re actually using 'cicn's rather than 'icl8's. (The only way you
  120.         can tell is by looking at the resources with ResEdit; the routine call isn’t significant.)
  121.         We could have used 'cicn's in the previous two examples, as you don’t have to do anything different
  122.         to show 'cicn's. The routines automatically check
  123.         for either 'cicn's or 'icl8's with the specified resource id. */
  124.         
  125.      /* Also, just to be different, we’re passing a pascal format string "\p"; */
  126.      /* which means we need to call ShowInitAndPascalName */
  127.         
  128.  
  129.      ShowInitAndPascalName ( 128, "\pICL8 or CICN", nil, noErr, false );
  130.      WaitFor ( 90 ); /* Pretend to do actual init work here */
  131.      ShowInitAndPascalName ( 128, "\pICL8 or CICN", nil, noErr, true );       
  132.      
  133.     
  134.     
  135.     
  136.     
  137.     
  138.      WaitFor ( 15 ); /* Fake pause between inits */
  139.      
  140.      
  141.      
  142.      
  143.     
  144.           
  145. /**************/
  146. /*            */
  147. /* EXAMPLE #3 */
  148. /*            */
  149. /**************/     
  150.      
  151.      /* No Bosses */
  152.      /* This example shows the most common way to show an init that fails. */
  153.      
  154.      /* We’re going to load an error message here, so that it will be displayed to
  155.         the user. If you don't want to display an error message, simply pass nil
  156.         for the third parameter. */
  157.      GetIndString ( tempPascalString, kExampleErrorMessagesSTRResourceID, exampleErrorMessageStringIndex ); /* Get the message */
  158.      CopyCStringFromPascalStringWithLimit ( tempCString, tempPascalString, 255 ); /* Convert it to c-format */
  159.      AppendCStringToCStringWithLimit ( extensionNameInCFormat, "\015\015", 255 ); /* Add a couple of line feeds the extension name */
  160.      AppendCStringToCStringWithLimit ( extensionNameInCFormat, tempCString, 255 ); /* Add the message after the extension name and linefeeds */
  161.  
  162.  
  163.  
  164.      /* Show the icon and init name and hilite the name (like it is selected) */
  165.           
  166.      ShowInitAndName ( 133, "No Bosses", nil, noErr, false ); /* Show the icon and init name and hilite the name (like it is selected) */  
  167.      WaitFor ( 90 ); /* Pretend to do actual init work here */
  168.      ShowInitAndName ( 134, "No Bosses", extensionNameInCFormat, nilHandleErr /* <-- whatever */, true ); /* ANY error number indicates the icon should be crossed out */         
  169.       
  170.      
  171.      
  172.      
  173.      
  174.      
  175.      
  176.      
  177.      WaitFor ( 15 ); /* Fake pause between inits */
  178.      
  179.      
  180.      
  181.      
  182.      
  183.      
  184.  
  185. /**************/
  186. /*            */
  187. /* EXAMPLE #4 */
  188. /*            */
  189. /**************/       
  190.      
  191.      
  192.      /* Animated Skier - “SKeys” */
  193.      
  194.      /* You can animate an icon just by passing a different resource id to ShowInitAndName. */
  195.      
  196.          
  197.      ShowInitAndName ( 129, "SKeys", nil, noErr, false );
  198.      
  199.      WaitFor ( 35 ); /* Pretend to do some actual init work here */
  200.      
  201.      ShowInitAndName ( 130, nil, nil, noErr, false );
  202.  
  203.      WaitFor ( 35 ); /* Pretend to do some actual init work here */
  204.  
  205.      ShowInitAndName ( 131, nil, nil, noErr, false );
  206.  
  207.      WaitFor ( 35 ); /* Pretend to do some actual init work here */
  208.  
  209.      ShowInitAndName ( 132, "...ouch", nil, noErr, true );
  210.                         
  211.      
  212.      
  213.      
  214.      
  215.      
  216.      WaitFor ( 15 ); /* Fake pause between inits */
  217.      
  218.      
  219.      
  220.      
  221.     
  222.      
  223. /**************/
  224. /*            */
  225. /* EXAMPLE #5 */
  226. /*            */
  227. /**************/       
  228.  
  229.      /* Storm Impact, Inc. */
  230.      
  231.      
  232.      ShowInitAndName ( 137, "Storm Impact, Inc.", nil, noErr, true );
  233.      /* Show the icon and init name without ever highlighting - just to show you it could be done. */         
  234. }
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244. void WaitFor ( long howLongToWaitInSixtiethsOfASecond )
  245. {
  246.      /* This causes a pause during startup - to simulate an init installing itself. */
  247.      /* You don’t need this routine in your actual init.                            */
  248.  
  249.      /* 96/01/11   v1.0.0   David Cook   First version  */ 
  250.  
  251.      long timeToFly;
  252.      
  253.           
  254.      timeToFly = TickCount ( ) + howLongToWaitInSixtiethsOfASecond;
  255.      
  256.      while ( timeToFly > TickCount ( ) )
  257.      {
  258.      };
  259. }
  260.  
  261.  
  262.  
  263. void AppendCStringToCStringWithLimit ( char *destinationCStringPtr, char *sourceCStringPtr, unsigned long limit )
  264. {
  265.      /* This copies a c-formatted string to the end of another c-formatted string.  */
  266.      /* If the total length of the two strings exceeds "limit", only the characters */
  267.      /* within limit are appended.                                                  */
  268.      
  269.      /*  01.00  95/01/12  D. Cook   Initial Definition */
  270.  
  271.  
  272.      if ( limit > 0 && destinationCStringPtr != nil && sourceCStringPtr != nil )
  273.      {
  274.           while ( limit > 0 && *destinationCStringPtr != 0 )
  275.           {
  276.                limit--;
  277.                
  278.                destinationCStringPtr++;
  279.           }
  280.           
  281.           
  282.           while ( limit > 0 && *sourceCStringPtr != 0 )
  283.           {
  284.                limit--;
  285.                
  286.                *destinationCStringPtr = *sourceCStringPtr;
  287.                destinationCStringPtr++;
  288.                sourceCStringPtr++;
  289.           }
  290.           
  291.           *destinationCStringPtr = 0;
  292.      }
  293. }
  294.